// 各位大佬 谁给补全这里的方法
// 1. 已知你的项目中有一个封装的公共方法，用来向服务端请求数据（你无法更改，只能调用）：
const request = () => {
  return new Promise(resolve => {
    // 用 setTimeout 来模拟向服务端请求数据的过程
    setTimeout(() => {
      resolve(++request.n);
    }, 1e3);
  });
};
request.n = 0;


// 你接到了一个需求，技术实现上需要频繁调用这个方法来请求数据
// 为了优化性能，希望通过避免重复请求来减少请求的频率

// 要求是实现一个 wrapRequest 方法（函数闭包）来做到复用单次 request 的结果：
function wrapRequest() {

  let requesting=false;
  let instance=null;
  // 代码逻辑
  // 如果当前没有在发起请求（或上次请求已发起并返回），（重新）发起一次请求
 
  // 如果有请求正在发起并且未返回，使用这一次请求的返回结果
  return function () {
    // 实际在业务代码中会调用这个 function
    // 代码逻辑，最终返回 Promise 实例，拿到结果
    if(requesting){
      return instance
    }else{
      requesting=true;
      return instance = new Promise(resolve => {
        request().then((res)=>{
          requesting=false;
          resolve(res);
        })
      });
    }
  }
}

// 代码调用示例：
const wrapped = wrapRequest();

// 只会发起一次 request 请求，都复用第一次 request 服务端返回的结果
wrapped().then(n => { console.log(n); });
wrapped().then(n => { console.log(n); });
wrapped().then(n => { console.log(n); });

// 第一次 request 结果已经返回，重新发第二次 request 请求
// 只会发起一次 request 请求，都复用第二次 request 服务端返回的结果
setTimeout(() => {
  wrapped().then(n => { console.log(n); });
  wrapped().then(n => { console.log(n); });
  wrapped().then(n => { console.log(n); });
}, 2e3);